package feie

import (
	"crypto/sha1"
	"encoding/hex"
	"encoding/json"
	"errors"
	"io"
	"net/http"
	"net/url"
	"strconv"
	"time"
)

var (
	// 飞鹅云后台注册的账号名
	USER = ""
	// 飞鹅云后台注册账号后生成的UKEY
	UKEY = ""
	// 添加打印机
	OpenApi = "https://api.feieyun.cn/Api/Open/"
)

/*
	打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填)，
	多台打印机请换行（\n）添加新打印机信息，每次最多100台。
	示例：
	316500010 # abcdefgh # 快餐前台 # 13688889999
	316500011 # abcdefgh # 快餐厨房 # 13688889990
*/
func AddPrinter(snlist string) error {
	itime := time.Now().Unix()
	stime := strconv.FormatInt(itime, 10)
	sig := encode(USER + UKEY + stime)
	postValues := url.Values{}
	// 账号名
	postValues.Add("user", USER)
	// 当前时间的秒数，请求时间
	postValues.Add("stime", stime)
	// 签名
	postValues.Add("sig", sig)
	// 固定参数
	postValues.Add("apiname", "Open_printerAddlist")
	// 打印机列表
	postValues.Add("printerContent", snlist)
	form, err := http.PostForm(OpenApi, postValues)
	if err != nil {
		return err
	}
	defer func() {
		_ = form.Body.Close()
	}()
	data, err := io.ReadAll(form.Body)
	if err != nil {
		return err
	}
	var da = struct {
		Ok  []string
		Msg string
	}{}
	err = json.Unmarshal(data, &da)
	if err != nil {
		return err
	}
	if len(da.Ok) == 0 {
		return errors.New(da.Msg)
	}
	return nil
}

// 打印内容，打印机编号，打印次数
func Print(data, sn string, times int) error {
	/*
		标签说明：
		单标签:
		"<BR>"为换行,"<CUT>"为切刀指令(主动切纸,仅限切刀打印机使用才有效果)
		"<LOGO>"为打印LOGO指令(前提是预先在机器内置LOGO图片),"<PLUGIN>"为钱箱或者外置音响指令
		成对标签：
		"<CB></CB>"为居中放大一倍,"<B></B>"为放大一倍,"<C></C>"为居中,<L></L>字体变高一倍
		<W></W>字体变宽一倍,"<QR></QR>"为二维码,"<BOLD></BOLD>"为字体加粗,"<RIGHT></RIGHT>"为右对齐
	*/
	itime := time.Now().Unix()
	stime := strconv.FormatInt(itime, 10)
	sig := encode(USER + UKEY + stime)
	postValues := url.Values{}
	// 账号名
	postValues.Add("user", USER)
	// 当前时间的秒数，请求时间
	postValues.Add("stime", stime)
	// 签名
	postValues.Add("sig", sig)
	// 固定参数
	postValues.Add("apiname", "Open_printMsg")
	// 打印机编号
	postValues.Add("sn", sn)
	// 打印内容
	postValues.Add("content", data)
	// 打印次数
	if times == 0 {
		times = 1
	}
	postValues.Add("times", strconv.Itoa(times))
	form, err := http.PostForm(OpenApi, postValues)
	if err != nil {
		return err
	}
	defer func() {
		_ = form.Body.Close()
	}()
	bys, err := io.ReadAll(form.Body)
	if err != nil {
		return err
	}
	var da = struct {
		Ok  []string
		Msg string
	}{}
	err = json.Unmarshal(bys, &da)
	if err != nil {
		return err
	}
	if da.Msg != "ok" {
		return errors.New(da.Msg)
	}
	return nil
}

func encode(str string) string {
	s := sha1.Sum([]byte(str))
	strsha1 := hex.EncodeToString(s[:])
	return strsha1
}
